IPython has a cell magic, %%capture
, which captures the stdout/stderr of a cell. With this magic you can discard these streams or store them in a variable.
from __future__ import print_function
import sys
By default, %%capture
discards these streams. This is a simple way to suppress unwanted output.
%%capture
print('hi, stdout')
print('hi, stderr', file=sys.stderr)
If you specify a name, then stdout/stderr will be stored in an object in your namespace.
%%capture captured
print('hi, stdout')
print('hi, stderr', file=sys.stderr)
captured
<IPython.utils.capture.CapturedIO at 0x1076c9310>
Calling the object writes the output to stdout/stderr as appropriate.
captured()
hi, stdout
hi, stderr
captured.stdout
'hi, stdout\n'
captured.stderr
'hi, stderr\n'
%%capture
grabs all output types, not just stdout/stderr, so you can do plots and use IPython's display system inside %%capture
%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np
%%capture wontshutup
print("setting up X")
x = np.linspace(0,5,1000)
print("step 2: constructing y-data")
y = np.sin(x)
print("step 3: display info about y")
plt.plot(x,y)
print("okay, I'm done now")
wontshutup()
setting up X step 2: constructing y-data step 3: display info about y okay, I'm done now
And you can selectively disable capturing stdout, stderr or rich display, by passing --no-stdout
, --no-stderr
and --no-display
%%capture cap --no-stderr
print('hi, stdout')
print("hello, stderr", file=sys.stderr)
hello, stderr
cap.stdout
'hi, stdout\n'
cap.stderr
''
cap.outputs
[]